package com.mqb;


import lombok.Data;
import lombok.experimental.Accessors;

import java.time.LocalDateTime;

/**
 *
 * 目标c2在线
 *
 * c1             server             c2
 * |       R1       |                 |
 * |     ----->     |                 |
 * |       A1       |                 |
 * |     <-----     |                 |
 * |                |           N1    |      D1
 * |                |        ----->   |   这种类型定为 deliver
 * |                |           R2    |
 * |                |        <-----   |
 * |                |           A2    |
 * |                |        ----->   |
 * |      N2        |                 |
 * |    <-----      |                 |
 *
 * R：RequestMsg
 * A：AckMsg
 * N：NotifyMsg
 * 一个 R 必须对应一个 A
 *
 * 若R1或A1失败，即客户端c1无法接收到A1的情况下，c1提示消息发送失败（时间范围？）
 *
 * 若N1、R2、A2、N2其中之一失败，后果就是客户端c1无法接收到N2，所以c1可以建立一个 等待回应的队列 Queue，将msgid存放在里面，
 * 若一段时间内没有收到，则尝试从新发送消息。
 * 注意这里可能会产生消息重复的情况，当丢失的是 N2 的时候，消息其实已经被c2收到了，只是c1无法感知，所以需要msgid唯一，以便c2去重（保持服务端无状态）
 *
 * (总而言之，一次完整的消息发送流程中，发送方和接受方，都必须收到一次ACK + 一次 NOTIFY（或DELIVER）)
 *
 *
 *
 * 目标c2不在线
 * c1             server             db
 * |       R1       |                 |
 * |     ----->     |                 |
 * |       A1       |                 |
 * |     <-----     |                 |
 * |                |         persist |
 * |                |        ----->   |
 * |      N1        |                 |
 * |    <-----      |                 |
 *
 * 若目标c2不在线，则消息被持久化，持久化成功后，视为发送成功，服务端伪造一个响应 N1 给客户端（等同于上面的N2）
 *
 */
@Data
@Accessors(chain = true)
public abstract class BaseMsg {
    /**
     * msgId
     */
    protected String id;

    /**
     * 消息类型 MsgType
     */
    protected String msgType;

    /**
     * 接收者id
     */
    protected String recId;

    /**
     * 消息发送时间
     */
    protected LocalDateTime dateTime;
}
